package com.yuan.config;

import com.fasterxml.jackson.databind.DatabindException;
import com.yuan.bean.Pet;
import com.yuan.bean.Test;
import com.yuan.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.*;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * @Configuration(proxyBeanMethods = true) 配置类里面使用@Bean标注在方法上给容器注册组件，默认是单实例的
 * @Configuration(proxyBeanMethods = false)不会保留代理对象每次调用都会创建新的对象
 * 如果别人要使用组件就是用true，不使用就选择false则可以提高运行速度
 * @Import({参数一：指定容器组件，导入的类}) 参数一：默认组件名：包名+类名
 * 参数二：默认组件名：包名+类名+随机生成
 * @ConditionalOnBean(name = "test") 对象存在则不创建
 * @ConditionalOnMissingBean(name = "test") 对象不存在则创建
 * @ImportResource("扫描路径") 将xml配置文件解析到此处让他里面管理的对象进行生效
 */
@Import({User.class, Test.class})
@Configuration(proxyBeanMethods = true) //标注为配置类
//@ConditionalOnBean(name = "test")  //判断组件中注册的是否有test对象否则不创建
//@ConditionalOnMissingBean(name = "test") //容器中没有test组件则创建
@ImportResource("classpath:beans.xml") //将配置文件解析到此处,让他的配置来进行生效
public class MyConfig {

    //外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
    //IOC控制反转
    @Bean //给容器中添加组件,方法名作为组件的id,返回的类型就是组件类型,返回的值：就是组件在容器中的实例
    public User user01() {
        User zhangsan = new User();
        //设置值
        zhangsan.setAge(18);
        //设置值
        zhangsan.setName("雨安");
        //设置值 user组件依赖了Pet组件
        zhangsan.setPet(dog());
        //返回值
        return zhangsan;
    }

    //IOC控制反转
    @Bean("tom")
    public Pet dog() {
        //返回值
        return new Pet("dog");
    }

    public Test test() {
        return new Test();
    }


}
